//package org.jeecg.modules.demo.gmslopedata.controller;
//
//import com.zaxxer.hikari.HikariConfig;
//import com.zaxxer.hikari.HikariDataSource;
//import io.swagger.annotations.Api;
//import io.swagger.annotations.ApiOperation;
//import lombok.Data;
//import lombok.extern.slf4j.Slf4j;
//import org.jeecg.common.api.vo.Result;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestBody;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//
//import javax.annotation.PostConstruct;
//import javax.sql.DataSource;
//import java.sql.*;
//import java.util.concurrent.ArrayBlockingQueue;
//import java.util.concurrent.BlockingQueue;
//import java.util.concurrent.TimeUnit;
//
//@Slf4j
//@Api(tags = "postgresql类型查询接口")
//@RestController
//@RequestMapping("/postgresql/type")
//public class SockTypeController {
//
//    // PostgreSQL 数据库配置
//    @Value(value = "${gm.POSTGRESQL.JDBC_URL}")
//    private String JDBC_URL;
//    @Value(value = "${gm.POSTGRESQL.USERNAME}")
//    private  String USERNAME ;
//
//    @Value(value = "${gm.POSTGRESQL.PASSWORD}")
//    private  String PASSWORD ;
//    @Value(value = "${gm.POSTGRESQL.TABLE_NAME}")
//    private  String GEO_TABLE_NAME;
//
//    @Value(value = "${gm.POSTGRESQL.SOCK_TABLE_NAME}")
//    private  String SOCK_TABLE_NAME ;
//
//    // 连接池配置
//    @Value(value = "${gm.POSTGRESQL.MAX_POOL_SIZE}")
//    private  int MAX_POOL_SIZE ;
//    @Value(value = "${gm.POSTGRESQL.INITIAL_POOL_SIZE}")
//    private  int INITIAL_POOL_SIZE;
//
//
////    spring.datasource.hikari.maximum-pool-size=20
////    spring.datasource.hikari.minimum-idle=5
////    spring.datasource.hikari.connection-timeout=30000
////    spring.datasource.hikari.idle-timeout=600000
//
//
//    // 连接池实例
//    private static final ConnectionPool CONNECTION_POOL;
//
//    private DataSource dataSource;
//
//    @PostConstruct
//    public void initDataSource() {
//        HikariConfig config = new HikariConfig();
//        config.setJdbcUrl(JDBC_URL);
//        config.setUsername(USERNAME);
//        config.setPassword(PASSWORD);
//        config.setMaximumPoolSize(MAX_POOL_SIZE);
//        config.setMinimumIdle(INITIAL_POOL_SIZE);
//        config.setConnectionTimeout(30000);
//        config.setIdleTimeout(600000);
//        dataSource = new HikariDataSource(config);
//    }
//    // 静态初始化块 - 初始化连接池
//    static {
//        try {
//            // 注册驱动
//            Class.forName("org.postgresql.Driver");
//
//            // 初始化连接池
//            CONNECTION_POOL = new ConnectionPool(
//                    JDBC_URL,
//                    USERNAME,
//                    PASSWORD,
//                    INITIAL_POOL_SIZE,
//                    MAX_POOL_SIZE
//            );
//            log.info("PostgreSQL 连接池初始化成功");
//        } catch (ClassNotFoundException | SQLException e) {
//            throw new RuntimeException("连接池初始化失败", e);
//        }
//    }
//
//    @ApiOperation(value = "查询岩组类型", notes = "根据经纬度查询岩组类型")
//    @PostMapping("/selectSockType")
//    public Result<String> selectSockType(@RequestBody QueryPointRequest request) {
//        Connection conn = null;
//        PreparedStatement pstmt = null;
//        ResultSet rs = null;
//
//        try {
//            double longitude = request.getLongitude();
//            double latitude = request.getLatitude();
//
//           log.info("查询点坐标: 经度=%.6f, 纬度=%.6f%n", longitude, latitude);
//
//            // 从连接池获取连接
//            conn = CONNECTION_POOL.getConnection();
//
//            // 确保连接处于干净状态
//            resetConnection(conn);
//
////            SELECT *
////                    FROM public.socktype
////            WHERE ST_Contains(
////                    geom,
////                    ST_Transform(
////                            ST_SetSRID(ST_MakePoint(116.13647460937501, 25.962983554822678), 4326),
////                            9999
////                    )
////);
//            StringBuilder sqlBuilder = new StringBuilder();
//            sqlBuilder.append("SELECT gid,岩类, 岩类名称 ")
//                        .append("FROM ").append(SOCK_TABLE_NAME).append(" ")
//                        .append("WHERE ST_Contains(")
//                            .append("  geom, ")
//                            .append("  ST_Transform(")
//                                .append("    ST_SetSRID(ST_MakePoint(" +longitude+ ", " +latitude+ "), 4326),")
//                                .append("    9999")
//                            .append("  )")
//                        .append(") ");
//
//            String sql = sqlBuilder.toString();
//            System.out.println("执行SQL: " + sql);
//
//            // 使用PreparedStatement防止SQL注入
//            pstmt = conn.prepareStatement(sql);
//
//            // 设置查询超时（5秒）
//            pstmt.setQueryTimeout(5);
//
//            rs = pstmt.executeQuery();
//            String combinedValues = "";
//
//            if (rs.next()) {
//
//                String rockType = rs.getString("岩类");
//                String rockTypeName = rs.getString("岩类名称");
//                combinedValues=rockType + " " + rockTypeName.trim();
//                log.info("找到匹配记录: " + combinedValues);
//                return Result.ok(combinedValues);
//            } else {
//               log.error("未找到匹配记录");
//                return Result.ok("未找到匹配记录");
//            }
//        } catch (SQLException e) {
//            log.error("数据库查询异常: " + e.getMessage(),e);
//            return Result.error("数据库查询异常: " + e.getSQLState() + " - " + e.getMessage());
//        } catch (Exception e) {
//            log.error("系统异常: ", e);
//            return Result.error("系统异常: " + e.getMessage());
//        } finally {
//            // 释放资源并将连接返回到连接池
//            closeResources(rs, pstmt, conn);
//        }
//    }
//
//    @ApiOperation(value = "查询坡度类型", notes = "查询坡度类型")
//    @PostMapping("/selectGeoType")
//    public Result<String> selectGeoType(@RequestBody QueryPointRequest request) {
//        Connection conn = null;
//        PreparedStatement pstmt = null;
//        ResultSet rs = null;
//
//        try {
//            double longitude = request.getLongitude();
//            double latitude = request.getLatitude();
//
//            log.info("查询点坐标: 经度=%.6f, 纬度=%.6f%n", longitude, latitude);
//
//            // 从连接池获取连接
//            conn = CONNECTION_POOL.getConnection();
//
//            // 确保连接处于干净状态
//            resetConnection(conn);
//
//            // 构建查询SQL - 按照您提供的正确格式
//            StringBuilder sqlBuilder = new StringBuilder();
//            sqlBuilder.append("SELECT id, gridcode ")
//                    .append("FROM ").append(TABLE_NAME).append(" ")
//                    .append("WHERE ST_Intersects(")
//                    .append("  the_geom, ")
//                    .append("  ST_SetSRID(ST_MakePoint(" +latitude+ ", " +longitude+ "), 4326)")
//                    .append(") ");
//
//            // 添加LIMIT 1以提高性能（如果只需要第一个匹配结果）
//            sqlBuilder.append("LIMIT 1");
//
//            String sql = sqlBuilder.toString();
//            log.info("执行SQL: " + sql);
//
//            // 使用PreparedStatement防止SQL注入
//            pstmt = conn.prepareStatement(sql);
//
//            // 设置参数 - 注意顺序：经度在前，纬度在后
////            pstmt.setDouble(1, latitude);  // ST_MakePoint的第一个参数是经度
////            pstmt.setDouble(2, longitude);   // ST_MakePoint的第二个参数是纬度
//
//            // 设置查询超时（5秒）
//            pstmt.setQueryTimeout(5);
//
//            rs = pstmt.executeQuery();
//            String result="";
//
//            if (rs.next()) {
//                String slopeValue =rs.getString("gridcode");
//                switch (slopeValue) {
//                    case "1":
//                        result = "A 小于20°".trim();
//                        break;
//                    case "2":
//                        result = "B 20°-30°".trim();
//                        break;
//                    case "3":
//                        result = "C 大于30°".trim();
//                        break;
//                    default:
//                        result = "未知坡度类型";
//                }
//
//               log.info("找到匹配记录: " + result);
//                return Result.ok(result);
//            } else {
//                result = "A 小于20°".trim();
//                System.out.println("未找到匹配记录");
//                return Result.ok(result);
//            }
//        } catch (SQLException e) {
//           log.error("数据库查询异常: " + e.getMessage(),e);
//            return Result.error("数据库查询异常: " + e.getSQLState() + " - " + e.getMessage());
//        } catch (Exception e) {
//         log.error("系统异常: " + e.getMessage(),e);
//            return Result.error("系统异常: " + e.getMessage());
//        } finally {
//            // 释放资源并将连接返回到连接池
//            closeResources(rs, pstmt, conn);
//        }
//    }
//
//    // 重置连接状态（解决事务中止问题）
//    private void resetConnection(Connection conn) throws SQLException {
//        try {
//            // 如果事务被中止，执行回滚
//            if (!conn.getAutoCommit()) {
//                conn.rollback();
//                System.out.println("执行事务回滚以重置连接状态");
//            }
//
//            // 设置自动提交模式（查询不需要事务）
//            conn.setAutoCommit(true);
//        } catch (SQLException e) {
//            System.err.println("重置连接状态失败: " + e.getMessage());
//
//            // 如果重置失败，关闭问题连接
//            CONNECTION_POOL.closeProblemConnection(conn);
//            throw e;
//        }
//    }
//
//    // 安全关闭所有资源并将连接返回到连接池
//    private void closeResources(ResultSet rs, PreparedStatement pstmt, Connection conn) {
//        try {
//            if (rs != null) rs.close();
//        } catch (SQLException ignored) {}
//        try {
//            if (pstmt != null) pstmt.close();
//        } catch (SQLException ignored) {}
//        try {
//            if (conn != null) CONNECTION_POOL.releaseConnection(conn);
//        } catch (SQLException ignored) {}
//    }
//
//    // ================ 内部类 ================ //
//
//    // 请求参数类
//    @Data
//    static class QueryPointRequest {
//        private double longitude;
//        private double latitude;
//    }
//
//    // ================ 连接池实现 ================ //
//
//    /**
//     * 增强的数据库连接池实现
//     */
//    static class ConnectionPool {
//        private final String url;
//        private final String username;
//        private final String password;
//        private final int maxPoolSize;
//        private final int initialPoolSize;
//
//        // 使用阻塞队列管理连接
//        private final BlockingQueue<Connection> availableConnections;
//        private int activeConnections = 0;
//
//        public ConnectionPool(String url, String username, String password,
//                              int initialPoolSize, int maxPoolSize)
//                throws SQLException {
//
//            this.url = url;
//            this.username = username;
//            this.password = password;
//            this.initialPoolSize = initialPoolSize;
//            this.maxPoolSize = maxPoolSize;
//            this.availableConnections = new ArrayBlockingQueue<>(maxPoolSize);
//
//            // 初始化连接池
//            initializePool();
//        }
//
//        /**
//         * 初始化连接池
//         */
//        private void initializePool() throws SQLException {
//            for (int i = 0; i < initialPoolSize; i++) {
//                availableConnections.add(createNewConnection());
//            }
//            activeConnections = initialPoolSize;
//        }
//
//        /**
//         * 获取数据库连接
//         */
//        public synchronized Connection getConnection() throws SQLException {
//            try {
//                // 优先使用池中空闲连接
//                if (!availableConnections.isEmpty()) {
//                    Connection conn = availableConnections.poll();
//                    if (validateConnection(conn)) {
//                        return conn;
//                    } else {
//                        // 无效连接则移除并创建新连接
//                        activeConnections--;
//                        return getConnection();
//                    }
//                }
//
//                // 创建新连接（如果未达到上限）
//                if (activeConnections < maxPoolSize) {
//                    Connection newConn = createNewConnection();
//                    activeConnections++;
//                    return newConn;
//                }
//
//                // 等待可用连接（最多等待5秒）
//                System.out.println("等待可用连接...");
//                Connection conn = availableConnections.poll(5, TimeUnit.SECONDS);
//                if (conn != null && validateConnection(conn)) {
//                    return conn;
//                }
//
//                throw new SQLException("连接池已达到最大大小，无法获取连接");
//
//            } catch (InterruptedException e) {
//                Thread.currentThread().interrupt();
//                throw new SQLException("获取连接被中断", e);
//            }
//        }
//
//        /**
//         * 验证连接是否有效
//         */
//        private boolean validateConnection(Connection conn) {
//            try {
//                if (conn.isClosed()) {
//                    return false;
//                }
//
//                // 执行简单查询验证连接
//                try (Statement stmt = conn.createStatement()) {
//                    stmt.executeQuery("SELECT 1").close();
//                }
//                return true;
//
//            } catch (SQLException e) {
//                return false;
//            }
//        }
//
//        /**
//         * 释放连接回连接池
//         */
//        public synchronized void releaseConnection(Connection conn) throws SQLException {
//            if (conn == null) return;
//
//            try {
//                // 重置连接状态
//                if (!conn.getAutoCommit()) conn.setAutoCommit(true);
//
//                // 如果连接仍然有效，且池未满，则放回池中
//                if (validateConnection(conn) && availableConnections.size() < maxPoolSize) {
//                    availableConnections.offer(conn);
//                } else {
//                    // 关闭无效连接
//                    closeConnection(conn);
//                }
//
//            } catch (SQLException e) {
//                // 如果连接有问题，关闭它
//                closeConnection(conn);
//                throw e;
//            }
//        }
//
//        /**
//         * 关闭问题连接
//         */
//        public void closeProblemConnection(Connection conn) {
//            if (conn != null) {
//                activeConnections--;
//                closeConnection(conn);
//            }
//        }
//
//        /**
//         * 安全关闭连接
//         */
//        private void closeConnection(Connection conn) {
//            try {
//                if (!conn.isClosed()) {
//                    conn.close();
//                }
//            } catch (SQLException ignored) {}
//        }
//
//        /**
//         * 创建新连接（配置为自动提交）
//         */
//        private Connection createNewConnection() throws SQLException {
//            Connection conn = DriverManager.getConnection(url, username, password);
//
//            // 配置连接（适合查询操作）
//            conn.setAutoCommit(true); // 启用自动提交
//            conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
//
//            return conn;
//        }
//    }
//}